package cin.ufpe.br.GDI.Dados;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import javax.imageio.ImageIO;

import oracle.sql.BLOB;

import cin.ufpe.br.GDI.Entidades.Fotografia;

public class RepositorioFotografia {
	
	private Connection conn;
	private FileInputStream in;
	
	
	public RepositorioFotografia(Connection conn){
		this.conn = conn;
	}

	public void inserir(Fotografia f, String cpfFotografo) throws SQLException, FileNotFoundException
	{
		PreparedStatement ps = conn.prepareStatement("INSERT INTO tb_fotografia VALUES( tp_fotografia(seq_fotografia.NEXTVAL,to_date(?,'DD/MM/YYYY'),?,nt_palavra_chave(" + f.getPalavraChave().toString() + "),?,(SELECT REF(ft) from tb_fotografo ft WHERE ft.cpf=" + cpfFotografo+")))");
	
		//ps.setInt(1, f.getCodigo());
		ps.setString(1, f.getData());
		ps.setString(2, f.getLocal());
				
		InputStream in = (InputStream) new FileInputStream(f.getFile());
		
		ps.setBinaryStream(3, in, (int) f.getFile().length());
				
		ps.executeUpdate();
		
		ps.close();
		
		conn.commit();
		
		
	}
	
	public ArrayList<Fotografia> buscarFotografia (String palavraChave) throws SQLException, IOException{
		
		PreparedStatement ps = conn.prepareStatement("SELECT f.codigo as codigo," +
                "to_char(f.data_fotografia) as data_foto," +
                "f.local_fotografia as loc," +
                "f.imagem as imagem," +
                "to_char(DEREF(f.fotografo).cpf) as cpfFotografo," +
        		"f.palavra_chave as palavra_chave FROM tb_fotografia f WHERE ? IN (SELECT * FROM TABLE(f.palavra_chave))");
		
		ps.setString(1, palavraChave.toLowerCase());
		
		ResultSet rs = ps.executeQuery();
		
		
		ArrayList<Fotografia> fotoList = new ArrayList<Fotografia>();
		
		ByteArrayInputStream in = null;
		BufferedImage img = null;
		Blob fotoBlob = null;
		//int codigo;
		String data, local, cpfFotografo;
		Fotografia f = null;
		byte byteQueEugosto[] = null;

		
		ArrayList<String> kw = new ArrayList<String>();
		String[] kw_array = null;
		
		while( rs.next() )
		{
			byteQueEugosto = null;
			
			//codigo = rs.getInt("codigo");
			data = rs.getString("data_foto");
			local = rs.getString("loc");
			cpfFotografo = rs.getString("cpfFotografo");
			fotoBlob = rs.getBlob("imagem");
			

			ResultSet rsKW = rs.getArray("palavra_chave").getResultSet();
			while( rsKW.next() )
			{
				kw.add(rsKW.getString(2));
			}

			kw_array = new String[kw.size()];
			for(int i = 0; i < kw.size(); i++) kw_array[i] = kw.get(i);	
			
			
			
			if( fotoBlob != null )

			{
				byteQueEugosto = fotoBlob.getBytes(1, (int) fotoBlob.length());
				in = new ByteArrayInputStream(byteQueEugosto);
				img = ImageIO.read(in);
			}
			
			
			
			f = new Fotografia(data, local, img);
			f.setPalavraChave(new PalavrasChave(kw_array));
			
			fotoList.add(f);
			
			
		}
		
		return fotoList;
		
		//Fotografia f = new Fotografia(codigo, data, palavrasChave, local, file)
		
	
	}

}
